﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConceptionLogiciel_Devoir1
{
    class SessionLocation
    {
        private Location location;
        private Vehicule vehicule;
        private Client client;
        private Facture facture;
        private Retour retour;

        // Constructor
        // -------------------------------------------------------------------------------
        public SessionLocation() 
        {
            this.facture = new Facture();
        }
        public SessionLocation(Client _client, Location _location, Vehicule _vehicule, Facture _paiement) 
        {
            this.location = _location;
            this.vehicule = _vehicule;
            this.client = _client;
            this.facture = _paiement;
        }

        // Get location
        // -------------------------------------------------------------------------------
        public Location getLocation()
        {
            return location;
        }

        // Client spécifique
        // -------------------------------------------------------------------------------
        public Client getClient(String _noPermis)
        {
            CatalogueClient catalogueClient = CatalogueClient.getInstance();
            return catalogueClient.getClient(_noPermis);
        }

        // Vehicule de la location courante
        // -------------------------------------------------------------------------------
        public Vehicule getVehicule()
        {
            return this.vehicule;
        }

        // Vehicule spécifique
        // -------------------------------------------------------------------------------
        public Vehicule getVehicule(String _noSerie)
        {
            CatalogueVehicule catalogueVehicule = CatalogueVehicule.getInstance();
            return catalogueVehicule.getVehicule(_noSerie);
        }

        // Get Retour
        // -------------------------------------------------------------------------------
        public Retour getRetour()
        {
            return this.retour;
        }

        // Get Client
        // -------------------------------------------------------------------------------
        public Client getClient()
        {
            return this.client;
        }

        // Get Facture
        // -------------------------------------------------------------------------------
        public Facture getFacture()
        {
            return this.facture;
        }

        // Créer une location pour le client
        // -------------------------------------------------------------------------------
        public void creerLocation(DateTime _dateDebut, DateTime _dateFin, double _frais)
        {
            location = new Location(CatalogueClient.getInstance().getNewLocationNumber(), _dateDebut, _dateFin, _frais);
        }

        // Sauvegarder la location dans la map du client
        // -------------------------------------------------------------------------------
        public void sauvegarderLocation(String _noSerie, String _noPermis, Facture paiement)
        {
            vehicule = getVehicule(_noSerie);
            CatalogueClient catalogueClient = CatalogueClient.getInstance();
            client = catalogueClient.getClient(_noPermis);
            client.ajouterLocation(catalogueClient.getNewLocationNumber(), new SessionLocation(client, location, vehicule, paiement));
        }

        // -------------------------------------------------------------------------------
        // Fontionnalités supplémentaire pour l'interface (ces fonctionnalités iraient dans
        // un autre classe, mais pour les besoins de la cause sa va etre ici) => 2 éléments
        // devaient être programmer
        // -------------------------------------------------------------------------------

        // Retourne la liste de tous les clients
        // -------------------------------------------------------------------------------
        public CatalogueClient getAllClient()
        {
            CatalogueClient catalogueClient = CatalogueClient.getInstance();
            return catalogueClient;
        }

        // Retourne la liste de tous les vehicule
        // -------------------------------------------------------------------------------
        public CatalogueVehicule getAllVehicule()
        {
            CatalogueVehicule catalogueVehicule = CatalogueVehicule.getInstance();
            return catalogueVehicule;
        }

        // Retourne la liste des locations actives du client
        // -------------------------------------------------------------------------------
        public Dictionary<int, SessionLocation> getLocationClient(String _noPermis)
        {
            Dictionary<int, SessionLocation> tmpLocation = getClient(_noPermis).getMapLocation();
            tmpLocation.Clear();
            foreach (var item in getClient(_noPermis).getMapLocation())
	        {
                if (item.Value.location.DateFin < DateTime.Now)
                    tmpLocation.Add(item.Key, item.Value);
	        }

            return tmpLocation;
        }
        
        // passe les informations necessaires a retour afin de calculer les frais
        // -------------------------------------------------------------------------------
        public void calculerFraisRetourLocation()
        {
            retour.calculerFrais(vehicule.Kilometrage, location.DateFin);
        }

        // debuter un retour, donc instancier retour et facture et calculer les frais necessaires
        // -------------------------------------------------------------------------------
        public void commencerRetour(double _nouveauKm, double _rabais, string _dommage)
        {
            retour = new Retour(DateTime.Now, _dommage, _nouveauKm, this.vehicule.Kilometrage, location.DateFin); 
            
            if (this.facture == null)
                facture = new Facture();

            facture.factureRetour(retour.FraisKm, retour.FraisRetard, _rabais);
        }

        // methode publique pour gerer le paiement d'une facture (location)
        // -------------------------------------------------------------------------------
        public void effectuerPaiement(double _prixLocation, double _depotGarantie, double _assurance)
        {
            facture.factureLocation(_prixLocation, _depotGarantie, _assurance);
        }


        // methode publique pour gerer le paiement d'une facture (retour)
        // -------------------------------------------------------------------------------
        public void effectuerPaiement(string _modePaiement, double _montant = 0.00)
        {
            facture.paiement(_modePaiement, _montant);   
        }

        // methode publique pour mettre la disponibilite à false
        // -------------------------------------------------------------------------------
        public void sauvegarderRetour()
        {
            vehicule.Disponibilite.EnLocation = false;
        }

        // Vérifier si un champ texte est numérique
        // -------------------------------------------------------------------------------
        public Boolean isNumeric(String str)
        {
            string Str = str.Trim();
            double Num;
            bool isNum = double.TryParse(Str, out Num);
            if (isNum)
                return true;
            else
                return false;
        }

    }  // End class SessionLocation
}  // End namespace devoir3_conception_location
